嗨嗨!大家好!歡迎來到 Rust 三十天挑戰的第七天!
恭喜你!我們已經完成了第一週的學習旅程。經過六天的密集學習,相信你已經對 Rust 已經有了基本的認識。今天我們要來回顧這一週學到的核心概念,並深入探索 Cargo 這個讓 Rust 開發變得如此便利的強大工具。
讓我們先來回顧一下這一週的重要里程碑:
核心概念:
let
、mut
、型別推導fn
、if
、loop
、match
實戰技能:
// 我們學會了這些基本語法
fn main() {
let name = "Rust";
let mut counter = 0;
for i in 1..=5 {
counter += i;
if counter > 10 {
println!("{} 的counter超過 10 了!", name);
break;
}
}
}
核心概念:
&T
和 &mut T
// 從這樣的困惑...
fn take_ownership(s: String) { /* s 被移動了! */ }
// 到這樣的理解!
fn borrow_value(s: &String) -> usize { s.len() }
fn modify_value(s: &mut String) { s.push_str("!"); }
核心概念:
Option<T>
:安全的處理空值match
模式匹配設計思維的轉變:
// 從物件導向思維...
// class User { ... }
// 到資料優先的設計!
struct User {
username: String,
email: String,
active: bool,
}
impl User {
fn new(username: String, email: String) -> Self {
User { username, email, active: true }
}
}
現在讓我們深入探索 Cargo。如果你曾經使用過 npm、pip、或 NuGet,你會發現 Cargo 融合了它們的優點。
Cargo 是一個「多合一」的工具,它集合了:
讓我們建立一個新專案來詳細了解 Cargo 的專案結構:
cargo new my_rust_blog --bin
cd my_rust_blog
這會建立以下結構:
my_rust_blog/
├── Cargo.toml # 專案設定檔(類似 package.json)
├── Cargo.lock # 鎖定相依性版本(類似 package-lock.json)
├── src/
│ └── main.rs # 進入點
└── target/ # 編譯輸出目錄(由 cargo build 產生)
Cargo.toml
:專案的心臟Cargo.toml
是整個專案的設定中心,以下是我簡單整理出來的例子:
建立新專案:
# 建立可執行檔專案
cargo new my_project --bin
# 建立函式庫專案
cargo new my_library --lib
專案資訊:
# 顯示專案後設資料
cargo metadata
# 檢查專案結構
cargo tree # 顯示相依性樹狀圖
cargo tree -i serde # 顯示誰依賴 serde
基本建置:
# 編譯專案(Debug 模式)
cargo build
# 編譯專案(Release 模式)
cargo build --release
# 只檢查語法,不產生執行檔
cargo check
# 編譯並執行
cargo run
新增相依性:
# 新增最新版本
cargo add serde
# 新增特定版本
cargo add serde@1.0.100
移除與更新:
# 移除套件
cargo remove serde
# 更新所有套件
cargo update
# 更新特定套件
cargo update serde
執行測試:
# 執行所有測試
cargo test
# 平行控制(單執行緒執行)
cargo test -- --test-threads=1
# 只執行忽略的測試
cargo test -- --ignored
Linting 與格式化:
# 格式化程式碼
cargo fmt
# 檢查格式化(CI 中常用)
cargo fmt --check
# 程式碼靜態分析
cargo clippy
# 更嚴格的 clippy 檢查
cargo clippy -- -D warnings
文件生成:
# 生成文件
cargo doc
# 生成並開啟文件
cargo doc --open
讓我們建立一個實際的專案來練習這些指令:讓我們建立這個專案並實際操作:
# 1. 建立專案
cargo new cargo_practice --bin
cd cargo_practice
# 2. 新增套件
cargo add serde --features derive
cargo add serde_json
# 3. 之前寫過的程式碼拿來用
# 4. 檢查程式碼
cargo check
# 5. 執行程式
cargo run
# 6. 執行測試
cargo test
# 7. 格式化程式碼
cargo fmt
# 8. 程式碼分析
cargo clippy
# 9. 生成文件
cargo doc --open
當專案變大時,我們可能想要將其分割成多個小套件。Cargo 的工作區功能讓我們可以管理多個相關的套件:工作區的優勢:
Cargo.lock
# 建立工作區專案
cargo new blog-workspace
cd blog-workspace
# 建立成員套件
cargo new blog-core --lib
cargo new blog-api --bin
cargo new blog-cli --bin
# 在根目錄執行所有測試
cargo test
# 建置整個工作區
cargo build
# 執行特定成員
cargo run -p blog-api
今天我們簡單探索了Cargo,當然有關於Cargo還有許多好用功能我沒有特別提到,目前就簡單介紹一定會使用到的幾個命令XD。
第一週回顧重點:
Cargo 工具鏈:
為第二週做準備:
第二週我們將深入 Rust 的核心,學習更進階的概念:
Vec
, HashMap
, String
深度探索panic!
到 Result<T, E>
的完整體系Box
, Rc
, Arc
與記憶體管理這些概念將為我們在第三週學習非同步程式設計和第四週的實戰專案打下堅實的基礎。
為了鞏固這一週的學習成果,有空的人也可以玩玩以下挑戰:
挑戰目標:建立一個個人任務管理系統
功能需求:
技術要求:
serde
進行 JSON 序列化cargo fmt
和 cargo clippy
提示:這個挑戰會用到我們這一週學到的所有概念,大家加油~
如果在實作過程中遇到任何問題,歡迎在留言區討論。記住,Rust 的學習可能稍微有點小難,但你一但學會了,就會特別開心XD
也恭喜完成我們大家第一週的學習!讓我們大家下周再見!